개방 폐쇄 원칙
-> 각각 다른 목적과 다른 이유에 의해 다른 시점에 독립적으로 변경될 수 있는 효율적인 구조를 만드는 것

템플릿 -> 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분자유롭게 변경되는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법

다시보는 초난감 DAO

예외처리 기능을 갖춘 DAO

UserDaodeleteAll()메소드를 보면 메소드를 마치기 전에 각각 close()를 호출해 리소스를 반환한다. 하지만 ConnectionPreparedStatementclose()메소드가 실행되지 않아서 제대로 리소스가 반환되지 않을 수 있다. 그래서 어떤 상황에서도 리소스를 반환할 수 있도록 JDBC코드에서는 try/catch/finally구문을 권장하고 있다. finally구문 안에서 close()메소드를 호출하면 무조건 리소스를 반환하고 메소드를 마치게 되니 문제가 해결된다. 하지만 close()메소드 자체에서도 SQLException이 발생할 수 있는 메소드이므로, 역시나 try/catch문으로 처리해 주어야 한다.


public void deleteAll() throws SQLException {
    Connection c = null;
    PreparedStatement ps = null;

    try {
        c = dataSource.getConnection();
        ps = c.prepareStatement("delete from users");
        ps.excuteUpdate();

    } catch (SQLException e) {
        throw e;
    } finally {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
            }
        }
        if (c != null) {
            try {
                c.close();
            } catch (SQLException e) {
            }
        }
    }
}


어느 시점에서 예외가 발생했는지에 따라서 close()를 사용할 수 있는 변수가 달라질 수 있기 때문에 finally에서는 반드시 cpsnull이 아닌지 먼저 확인한 후에 close()메소드를 호출해야 한다.

JDBC 조회 기능의 예외처리

조회를 위한 JDBC 코드에서는 Connection, PrepareStatement 외에 ResultSet 이 추가되기 때문에 코드가 좀 더 복잡하다. 하지만 구성읕 마찬가지 이므로, ResultSetclose()메소드가 반드시 호출되도록 만들면 된다.